import { StringHelper } from './string.helper';
export namespace Validate {
    export function checkPhone(val: string) {
        if (!(/^1[3456789]d{9}$/.test(val))) {
            alert("手机号码有误，请重填");
            return false;
        }
        return true;
    }

    const Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1];// 加权因子
    const ValideCode = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2];// 身份证验证位值.10代表X

    export function IdCardValidate(idCard) {
        idCard = StringHelper.trim(idCard);
        if (idCard.length == 15) {
            return isValidityBrithBy15IdCard(idCard);
        } else if (idCard.length == 18) {
            var a_idCard = idCard.split("");// 得到身份证数组
            if (isValidityBrithBy18IdCard(idCard) && isTrueValidateCodeBy18IdCard(a_idCard)) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
    /**
    * 判断身份证号码为18位时最后的验证位是否正确
    * @param a_idCard 身份证号码数组
    * @return
    */
    export function isTrueValidateCodeBy18IdCard(a_idCard) {
        var sum = 0; // 声明加权求和变量
        if (a_idCard[17].toLowerCase() == 'x') {
            a_idCard[17] = 10;// 将最后位为x的验证码替换为10方便后续操作
        }
        for (var n = 0; n < 17; n++) {
            sum += Wi[n] * a_idCard[n];// 加权求和
        }
        let valCodePosition = sum % 11;// 得到验证码所位置
        if (a_idCard[17] == ValideCode[valCodePosition]) {
            return true;
        } else {
            return false;
        }
    }
    /**
    * 通过身份证判断是男是女
    * @param idCard 15/18位身份证号码
    * @return 'female'-女、'male'-男
    */
    export function maleOrFemalByIdCard(idCard): 'female'|'male' {
        if (idCard.length == 15) {
            if (idCard.substring(14, 15) % 2 == 0) {
                return 'female';
            } else {
                return 'male';
            }
        } else if (idCard.length == 18) {
            if (idCard.substring(14, 17) % 2 == 0) {
                return 'female';
            } else {
                return 'male';
            }
        } else {
            return null;
        }
    }
    /**
      * 验证18位数身份证号码中的生日是否是有效生日
      * @param idCard 18位书身份证字符串
      * @return
      */
    function isValidityBrithBy18IdCard(idCard18) {
        var year = idCard18.substring(6, 10);
        var month = idCard18.substring(10, 12);
        var day = idCard18.substring(12, 14);
        var temp_date = new Date(year, parseFloat(month) - 1, parseFloat(day));
        // 这里用getFullYear()获取年份，避免千年虫问题
        if (temp_date.getFullYear() != parseFloat(year)
            || temp_date.getMonth() != parseFloat(month) - 1
            || temp_date.getDate() != parseFloat(day)) {
            return false;
        } else {
            return true;
        }
    }
    /**
     * 验证15位数身份证号码中的生日是否是有效生日
     * @param idCard15 15位书身份证字符串
     * @return
     */
    export function isValidityBrithBy15IdCard(idCard15) {
        var year = idCard15.substring(6, 8);
        var month = idCard15.substring(8, 10);
        var day = idCard15.substring(10, 12);
        var temp_date = new Date(year, parseFloat(month) - 1, parseFloat(day));
        // 对于老身份证中的你年龄则不需考虑千年虫问题而使用getYear()方法
        if (temp_date.getFullYear() != parseFloat(year)
            || temp_date.getMonth() != parseFloat(month) - 1
            || temp_date.getDate() != parseFloat(day)) {
            return false;
        } else {
            return true;
        }
    }


    //是否满18岁
    export function is18Ready(idCard) {
        var birthday;
        if (idCard.length == 15) {
            birthday = idCard.substring(6, 12);
        } else if (birthday.length == 18) {
            birthday = idCard.substring(6, 14);
        }
        var thisYear = birthday.substring(0, 4);
        var thisMonth = parseInt(birthday.substring(4, 6), 10) - 1;
        var thisDate = birthday.substring(6);
        var birthdayDate = new Date(thisYear, thisMonth, thisDate);
        var now = new Date();
        return now.getTime() - birthdayDate.getTime() >= 1000 * 60 * 60 * 24 * 365 * 18;
    }
}